{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import os\n",
    "import matplotlib.pyplot as plt\n",
    "plt.close(\"all\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "train_df=pd.read_csv('./data/train_v1.csv')\n",
    "test_df=pd.read_csv('./data/test_v1_periods.csv')#按0.5h计算\n",
    "test_day=pd.read_csv('./data/test_v1_day.csv')#按天计算\n",
    "wkd_df=pd.read_csv('./data/wkd_v1.csv')\n",
    "wkd_df=wkd_df.rename(columns={'ORIG_DT':'date'})\n",
    "train_df=train_df.merge(wkd_df)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "#将A/B岗位拆分出来分别分析，以天为粒度\n",
    "tmp=train_df[['date','post_id','amount']].groupby(['date','post_id'],sort=False).agg('sum')\n",
    "train_day_df=pd.DataFrame(tmp).reset_index()\n",
    "train_day_df_A=train_day_df[train_day_df['post_id']=='A'].reset_index(drop=True)\n",
    "train_day_df_B=train_day_df[train_day_df['post_id']=='B'].reset_index(drop=True)\n",
    "train_day_df_A=train_day_df_A.merge(wkd_df)\n",
    "train_day_df_B=train_day_df_B.merge(wkd_df)\n",
    "#\n",
    "def get_frt(df):\n",
    "    df['WKD_TYP_CD']=df['WKD_TYP_CD'].map({'WN':0,'SN': 1, 'NH': 1, 'SS': 1, 'WS': 0})\n",
    "    month=[]\n",
    "    day=[]\n",
    "    year=[]\n",
    "    dates=df['date'].values\n",
    "    for date in dates:\n",
    "        year.append(int(date.split('/')[0]))\n",
    "        month.append(int(date.split('/')[1]))\n",
    "        day.append(int(date.split('/')[2]))\n",
    "    df['year']=year\n",
    "    df['month']=month\n",
    "    df['day']=day\n",
    "    df.drop(['date','post_id'],axis=1,inplace=True)\n",
    "    return df\n",
    "train_day_df_A=get_frt(train_day_df_A)\n",
    "train_day_df_B=get_frt(train_day_df_B)\n",
    "train_day_df_A['amount']=train_day_df_A['amount']/1e4\n",
    "train_day_df_B['amount']=train_day_df_B['amount']/1e4"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x1f164dc1508>"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "ts = pd.Series(train_day_df_A['amount'].values, index=pd.date_range(\"1/1/2018\", periods=len(train_day_df_A['amount'].values)))\n",
    "ts.plot()\n",
    "ts = pd.Series(train_day_df_B['amount'].values, index=pd.date_range(\"1/1/2018\", periods=len(train_day_df_B['amount'].values)))\n",
    "ts.plot()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "对于A：\n",
    "- 可以看到18/10--18/11月增加了(59.1890-54.6016)/54.6016=8.4%\n",
    "- 可以看到19/10--19/11月增加了(46.6275-44.9047)/44.9047=3.8%\n",
    "\n",
    "对于B:\n",
    "- 可以看到18/10--18/11月增加了(12.88-11.72)/11.72=9.9%\n",
    "- 可以看到19/10--19/11月增加了(3.793-3.625)/3.625=4.6%\n",
    "18-19年月份之间的趋势变化基本一致，20年因为疫情影响，数值的绝对值在变化，\n",
    "但是趋势并未变化，如果以年份来看的话周期性十分明显。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x1f16576b1c8>"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#A按照year/month进行group,看看每一年中每一个月的变化\n",
    "group_year_month_A=train_day_df_A[['year','month','amount']].groupby(['year','month'],sort=False).agg(['sum'])\n",
    "group_year_month_A=pd.DataFrame(group_year_month_A).reset_index()\n",
    "group_year_month_A.columns=['year','month','amount']\n",
    "ts = pd.Series(group_year_month_A['amount'].values, index=pd.date_range(\"1/2018\", periods=len(group_year_month_A['amount'].values),freq=\"M\"))\n",
    "ts.plot()\n",
    "#B按照year/month进行group,看看每一年中每一个月的变化\n",
    "group_year_month_B=train_day_df_B[['year','month','amount']].groupby(['year','month'],sort=False).agg(['sum'])\n",
    "group_year_month_B=pd.DataFrame(group_year_month_B).reset_index()\n",
    "group_year_month_B.columns=['year','month','amount']\n",
    "ts = pd.Series(group_year_month_B['amount'].values, index=pd.date_range(\"1/2018\", periods=len(group_year_month_B['amount'].values),freq=\"M\"))\n",
    "ts.plot()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 分析18/19两年11月份的每一天的趋势\n",
    "\n",
    "- 如果只看day和amount的趋势，18/19各自11月份的变化趋势和天数关系其实不大\n",
    "- 但通过分析WKD_TYP_CD可以明显看到，11月份只有两种WKD_TYP_CD:WN/SN，当为WN时，业务量明显高于SN.这也是符合常识的\n",
    "- 20年11月份的WKD_TYP_CD也只有WN/SN两种情形，所以我们只需要考虑WN和SN对amount的影响\n",
    "  - 这里最朴素的想法是统计18，19年11月0,1对应的每一天的amount占一个月的比例"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.03926397564658053\n",
      "0.0415190392097041\n",
      "0.017024066971903562\n",
      "0.014233352955134861\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "'\\n0.03926397564658053\\n0.0415190392097041\\n0.017024066971903562\\n0.014233352955134861\\n所以如果得到20年11月份的总业务量nov_2020\\nnov_2020*(0.039+0.041)/2 if 当前day的WKD_TYP_CD==0\\nnov_2020*(0.017+0.014)/2 if 当前day的WKD_TYP_CD==1\\n'"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "nov_month=train_day_df_A[train_day_df_A['month']==11]\n",
    "nov_month_18=nov_month[nov_month['year']==2018][['WKD_TYP_CD','amount']].reset_index(drop=True)\n",
    "nov_month_19=nov_month[nov_month['year']==2019][['WKD_TYP_CD','amount']].reset_index(drop=True)\n",
    "nov_month_18['amount']/=np.sum(nov_month_18['amount'])\n",
    "nov_month_19['amount']/=np.sum(nov_month_19['amount'])\n",
    "nov_month_18['amount'].plot()\n",
    "nov_month_19['amount'].plot()\n",
    "print(nov_month_18[nov_month_18['WKD_TYP_CD']==0]['amount'].mean())\n",
    "print(nov_month_19[nov_month_19['WKD_TYP_CD']==0]['amount'].mean())\n",
    "print(nov_month_18[nov_month_18['WKD_TYP_CD']==1]['amount'].mean())\n",
    "print(nov_month_19[nov_month_19['WKD_TYP_CD']==1]['amount'].mean())\n",
    "'''\n",
    "0.03926397564658053\n",
    "0.0415190392097041\n",
    "0.017024066971903562\n",
    "0.014233352955134861\n",
    "所以如果得到20年11月份的总业务量nov_2020\n",
    "nov_2020*(0.039+0.041)/2 if 当前day的WKD_TYP_CD==0\n",
    "nov_2020*(0.017+0.014)/2 if 当前day的WKD_TYP_CD==1\n",
    "'''"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 规则法建模\n",
    "\n",
    "经过上面的分析其实可以看出来数据规律性极强，辅以一定简单的模型和规则就可以取得很好的效果，这里点到为止咯，大家自己项怎么利用数据的规律\n",
    "。目前利用**数据规律+一定的规则**可以得到的分数:\n",
    "- 任务一: 0.09\n",
    "- 任务二: 0.23"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## LSTM的baseline\n",
    "用LSTM的方法。\n",
    "- 任务一: 0.9\n",
    "- 任务二: 1.2\n",
    "\n",
    "**远不如直接利用数据规律+一定的规则来做**；\n",
    "这里还是给出基于LSTM的代码以供参考，但不建议使用，只要是为了给那些还不会利用LSTM建模时序问题的伙伴参考以下\n",
    "\n",
    "而且**LSTM的建模思路**还是值得学习的，这里给出我自己的构造思路\n",
    "\n",
    "- 输入序列长度为30day,需要预测的长度也为30day.序列-->>序列\n",
    "- 序列中每一个输入的维度(即我们构造的特征):[ 当天的业务量，month，day,WKD_TYP_CD)\n",
    "- 用1月份预测2月；2月预测3月.....10月就预测11月\n",
    "- 为了充分利用WKD_TYP_CD特征，因为这个特征太重要了，所以可以在解码的时候将该特征embeding进去\n",
    "\n",
    "**举例**:\n",
    "- LSTM的输入是9月份的30天amount值，以及这30天的month,day,WKD_TYP_CD特征\n",
    "- LSTM的输出是10月份的30天的amount值\n",
    "- 在LSTM解码的时候将10月份的WKD_TYP_CD特征embeding到网络里面和编码器的输出结合。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch-0 train_loss:13.35070226742671\n",
      "epoch-1 train_loss:3.032626564686115\n",
      "epoch-2 train_loss:1.5427961019369272\n",
      "epoch-3 train_loss:1.1438380837440492\n",
      "epoch-4 train_loss:0.9263771442266611\n",
      "epoch-5 train_loss:0.7648677725058336\n",
      "epoch-6 train_loss:0.7380401716782496\n",
      "epoch-7 train_loss:0.6677222279401925\n",
      "epoch-8 train_loss:0.6176427456048819\n",
      "epoch-9 train_loss:0.5791848086393796\n",
      "epoch-10 train_loss:0.5528260377737192\n",
      "epoch-11 train_loss:0.5250600571815784\n",
      "epoch-12 train_loss:0.4953721509529994\n",
      "epoch-13 train_loss:0.4768508085837731\n",
      "epoch-14 train_loss:0.43078980170763453\n",
      "epoch-15 train_loss:0.3963539570569992\n",
      "epoch-16 train_loss:0.36954775085816016\n",
      "epoch-17 train_loss:0.34626700167472546\n",
      "epoch-18 train_loss:0.3455156729771541\n",
      "epoch-19 train_loss:0.2938799291849136\n",
      "epoch-20 train_loss:0.2802966578648641\n",
      "epoch-21 train_loss:0.26006039083003996\n",
      "epoch-22 train_loss:0.24893111999218281\n",
      "epoch-23 train_loss:0.22620911850379063\n",
      "epoch-24 train_loss:0.2079131633043289\n",
      "epoch-25 train_loss:0.19516767721909742\n",
      "epoch-26 train_loss:0.19896893409582284\n",
      "epoch-27 train_loss:0.16888204102332777\n",
      "epoch-28 train_loss:0.15420712679624557\n",
      "epoch-29 train_loss:0.14253532519707313\n",
      "epoch-30 train_loss:0.13366504850295874\n",
      "epoch-31 train_loss:0.11924781627379931\n",
      "epoch-32 train_loss:0.10873184376038038\n",
      "epoch-33 train_loss:0.10753901325739347\n",
      "epoch-34 train_loss:0.09741102479971372\n",
      "epoch-35 train_loss:0.1446061345247122\n",
      "epoch-36 train_loss:0.10576625999349815\n",
      "epoch-37 train_loss:0.07962094803269093\n",
      "epoch-38 train_loss:0.07310723100717251\n",
      "epoch-39 train_loss:0.07099240829165165\n",
      "epoch-40 train_loss:0.06301743812285937\n",
      "epoch-41 train_loss:0.05988217655282754\n",
      "epoch-42 train_loss:0.05307441686208431\n",
      "epoch-43 train_loss:0.04868795069364401\n",
      "epoch-44 train_loss:0.046226598522984066\n",
      "epoch-45 train_loss:0.04162322847315898\n",
      "epoch-46 train_loss:0.039455130839577086\n",
      "epoch-47 train_loss:0.03540205029914012\n",
      "epoch-48 train_loss:0.03280505417631223\n",
      "epoch-49 train_loss:0.03221159316599369\n",
      "epoch-50 train_loss:0.03019536375426329\n",
      "epoch-51 train_loss:0.02714134153838341\n",
      "epoch-52 train_loss:0.026242254072656998\n"
     ]
    }
   ],
   "source": [
    "from torch.utils.data import Dataset,DataLoader\n",
    "import numpy as np\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.optim as optim\n",
    "from tqdm import tqdm\n",
    "import tushare as ts\n",
    "from copy import deepcopy as copy\n",
    "import matplotlib.pyplot as plt\n",
    "from torch.utils.data import DataLoader, TensorDataset\n",
    "import numpy as np\n",
    "#\n",
    "\n",
    "train_df=pd.read_csv('./data/train_v1.csv')\n",
    "test_df=pd.read_csv('./data/test_v1_periods.csv')#按0.5h计算\n",
    "test_day=pd.read_csv('./data/test_v1_day.csv')#按天计算\n",
    "wkd_df=pd.read_csv('./data/wkd_v1.csv')\n",
    "wkd_df=wkd_df.rename(columns={'ORIG_DT':'date'})\n",
    "train_df=train_df.merge(wkd_df)\n",
    "#\n",
    "#将A/B岗位拆分出来分别建模预测，注意这里取了一天的总量，暂时不考虑细粒度预测\n",
    "tmp=train_df[['date','post_id','amount']].groupby(['date','post_id'],sort=False).agg('sum')\n",
    "train_day_df=pd.DataFrame(tmp).reset_index()\n",
    "train_day_df_A=train_day_df[train_day_df['post_id']=='A'].reset_index(drop=True)\n",
    "train_day_df_B=train_day_df[train_day_df['post_id']=='B'].reset_index(drop=True)\n",
    "train_day_df_A=train_day_df_A.merge(wkd_df)\n",
    "train_day_df_B=train_day_df_B.merge(wkd_df)\n",
    "#\n",
    "def get_frt(df):\n",
    "    df['WKD_TYP_CD']=df['WKD_TYP_CD'].map({'WN':0,'SN': 1, 'NH': 2, 'SS': 3, 'WS': 4})\n",
    "    month=[]\n",
    "    day=[]\n",
    "    dates=df['date'].values\n",
    "    for date in dates:\n",
    "        month.append(date.split('/')[1])\n",
    "        day.append(date.split('/')[2])\n",
    "    df['month']=month\n",
    "    df['day']=day\n",
    "    df.drop(['date','post_id'],axis=1,inplace=True)\n",
    "    return df\n",
    "train_day_df_A=get_frt(train_day_df_A)\n",
    "train_day_df_B=get_frt(train_day_df_B)\n",
    "train_day_df_A['amount']=train_day_df_A['amount']/1e4\n",
    "train_day_df_B['amount']=train_day_df_B['amount']/1e4\n",
    "#\n",
    "class bankDataset(Dataset):\n",
    "    def __init__(self,train_len=60,pre_len=30,AB='A'):\n",
    "        '''\n",
    "        train_len:构建训练集的滑动窗口长度,以天为单位\n",
    "        pre_len:需要预测的天数,以天为单位\n",
    "        AB:训练A/B岗的模型\n",
    "        '''\n",
    "        super().__init__()\n",
    "        self.train_len=train_len\n",
    "        self.pre_len=pre_len\n",
    "        if AB=='A':\n",
    "            #加载A数据\n",
    "            df=train_day_df_A\n",
    "        else:\n",
    "            df=train_day_df_B\n",
    "        #\n",
    "        self.labels = df['amount']\n",
    "        self.train_data= df\n",
    "        self.Len=len(self.labels)\n",
    "        self.starts=[i*30 for i in range(31)]\n",
    "    #\n",
    "    def __len__(self):\n",
    "        return len(self.labels)#总共的天数\n",
    "    \n",
    "    def __getitem__(self, idx):\n",
    "        #随机起点截断\n",
    "        start_point=np.random.choice(self.starts)\n",
    "        #训练样本,\n",
    "        train_x = self.train_data.iloc[start_point: start_point+self.train_len].values\n",
    "        train_y = self.labels[start_point+self.train_len:start_point+self.train_len+self.pre_len].values\n",
    "        train_y_attention=self.train_data[['month','day','WKD_TYP_CD']].iloc[start_point+self.train_len:start_point+self.train_len+self.pre_len].values\n",
    "        train_x_attention=self.train_data[['amount']].iloc[start_point: start_point+self.train_len].values\n",
    "        #\n",
    "        train_x=torch.from_numpy(train_x.astype(np.float32))\n",
    "        train_y=torch.from_numpy(train_y.astype(np.float32))\n",
    "        train_x_attention=torch.from_numpy(train_x_attention.astype(np.float32))\n",
    "        train_y_attention=torch.from_numpy(train_y_attention.astype(np.float32))\n",
    "        attention=torch.cat([train_x_attention,train_y_attention],dim=1).reshape(1,-1)\n",
    "        #\n",
    "        return train_x, train_y,attention\n",
    "#\n",
    "class Model(nn.Module):\n",
    "    def __init__(self,input_dim=4,out_dim=30):\n",
    "        super(Model, self).__init__()\n",
    "        self.lstm_layer = nn.LSTM(input_size=input_dim, hidden_size=64, batch_first=True)\n",
    "        self.linear_layer = nn.Linear(in_features=64, out_features=out_dim, bias=True)\n",
    "        self.attention = nn.Sequential(\n",
    "             nn.Dropout(p=0.5),\n",
    "             nn.Linear(120, 30),\n",
    "             nn.ReLU(),\n",
    "             nn.Dropout(p=0.5),\n",
    "             nn.Linear(30, out_dim),\n",
    "        )\n",
    "    def forward(self, x,att):\n",
    "        #\n",
    "        '''\n",
    "        这里本来应该搭建一个LSTM-Encoder以及一个LSTM-Decoder，因为WKD_TYP_CD是一个\n",
    "        重要的特征，而11月份的WKD_TYP_CD特征是已知的，所以在解码的时候可以将这个特征\n",
    "        利用attention的方式加上去。这里为了简化模型，将decoder部分省略掉，WKD_TYP_CD的使用也不是\n",
    "        attention机制，而是直接使用全连接来提取了特征进行单独预测再和LSTM的预测结合起来\n",
    "        '''\n",
    "        out1, (h_n, h_c) = self.lstm_layer(x)\n",
    "        a, b, c = h_n.shape\n",
    "        out2 = self.linear_layer(h_n.reshape(a*b, c))\n",
    "        out_att=self.attention(att)\n",
    "        return out2+out_att\n",
    "\n",
    "#\n",
    "def train_model(max_epoch, train_loader,AB='A'):\n",
    "    # 训练模型\n",
    "    best_model = None\n",
    "    train_loss = 0\n",
    "    epoch_cnt = 0\n",
    "    for epoch in range(max_epoch):\n",
    "        total_train_loss = []\n",
    "        total_train_num = 0\n",
    "        for i, data in enumerate(train_loader):\n",
    "            x,y,attention=data\n",
    "            #print(x.shape,y.shape)\n",
    "            x_num = len(x)\n",
    "            p = model(x,attention)\n",
    "            loss = loss_func(p, y)\n",
    "            optimizer.zero_grad()\n",
    "            loss.backward()\n",
    "            optimizer.step()\n",
    "            total_train_loss.append(loss.item())\n",
    "            #\n",
    "        train_loss = np.mean(total_train_loss)\n",
    "        print('epoch-{} train_loss:{}'.format(epoch,train_loss))\n",
    "        if epoch%10==0:\n",
    "            torch.save(model.state_dict(), './ckpt/lstm'+'_epoch_'+AB+str(epoch)+'.pth')\n",
    "#\n",
    "if __name__ == '__main__':\n",
    "    # 参数\n",
    "    max_epoch = 101\n",
    "    input_dim=4\n",
    "    out_dim=30\n",
    "    batch_size = 16\n",
    "    AB='A'\n",
    "    if not os.path.exists('ckpt/'):\n",
    "        os.makedirs('ckpt/')\n",
    "    # 初始化模型\n",
    "    model = Model(input_dim=4,out_dim=30)\n",
    " \n",
    "    # 数据处理部分\n",
    "    train_dataset = bankDataset(train_len=30,pre_len=30,AB=AB)\n",
    "    train_loader = DataLoader(train_dataset,\n",
    "                             batch_size=batch_size,\n",
    "                             shuffle=True,\n",
    "                             num_workers=0)\n",
    "    #\n",
    "\n",
    "    # 损失函数和优化器\n",
    "    loss_func = nn.MSELoss()#SmoothL1Loss()#nn.MSELoss()\n",
    "    optimizer = optim.AdamW(model.parameters(), lr=3e-4)\n",
    "    train_model(max_epoch, train_loader,AB=AB)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.Size([1, 30, 4]) torch.Size([1, 1, 120])\n",
      "torch.Size([1, 30, 4]) torch.Size([1, 1, 120])\n",
      "2.2529144 0.4464044\n"
     ]
    }
   ],
   "source": [
    "#\n",
    "weight_path_A='./ckpt/lstm_epoch_A100.pth'\n",
    "model_A=Model(input_dim=4,out_dim=30)\n",
    "model_A.load_state_dict(torch.load(weight_path_A))\n",
    "model_A.eval()\n",
    "#\n",
    "weight_path_B='./ckpt/lstm_epoch_B50.pth'\n",
    "model_B=Model(input_dim=4,out_dim=30)\n",
    "model_B.load_state_dict(torch.load(weight_path_B))\n",
    "model_B.eval()\n",
    "#\n",
    "test_df=pd.read_csv('./data/test_v1_periods.csv')#按0.5h计算\n",
    "test_day=pd.read_csv('./data/test_v1_day.csv')#按天计算\n",
    "#将A/B岗位拆分出来分别建模预测，注意这里取了一天的总量，暂时不考虑细粒度预测\n",
    "tmp=test_df[['date','post_id']].groupby(['date','post_id'],sort=False).agg('sum')\n",
    "test_day_df=pd.DataFrame(tmp).reset_index()\n",
    "test_day_df_A=test_day_df[test_day_df['post_id']=='A'].reset_index(drop=True)\n",
    "test_day_df_B=test_day_df[test_day_df['post_id']=='B'].reset_index(drop=True)\n",
    "test_day_df_A=test_day_df_A.merge(wkd_df)\n",
    "test_day_df_B=test_day_df_B.merge(wkd_df)\n",
    "test_day_df_A=get_frt(test_day_df_A)\n",
    "test_day_df_B=get_frt(test_day_df_B)\n",
    "#------\n",
    "def predict(test_day_df_AB,train_day_df_AB):\n",
    "    test_data=torch.from_numpy(train_day_df_AB[-30:].values.astype(np.float32))\n",
    "    test_att_x=torch.from_numpy(train_day_df_AB[['amount']][-30:].values.astype(np.float32))\n",
    "    test_att_y=torch.from_numpy(test_day_df_AB[['month','day','WKD_TYP_CD']].values.astype(np.float32))\n",
    "    test_att=torch.cat([test_att_x,test_att_y],dim=1).reshape(1,-1)\n",
    "    test_data=test_data.unsqueeze(0)\n",
    "    test_att=test_att.unsqueeze(0)\n",
    "    print(test_data.shape,test_att.shape)\n",
    "    return test_data,test_att\n",
    "#\n",
    "x1,x2=predict(test_day_df_A,train_day_df_A)\n",
    "pre_A=model_A(x1,x2).detach().numpy()[0][0]\n",
    "x1,x2=predict(test_day_df_B,train_day_df_B)\n",
    "pre_B=model_B(x1,x2).detach().numpy()[0][0]\n",
    "print(pre_A.mean(),pre_B.mean())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "test_df=pd.read_csv('./data/test_v1_periods.csv')#按0.5h计算\n",
    "test_day=pd.read_csv('./data/test_v1_day.csv')#按天计算\n",
    "#\n",
    "pre_day=[]\n",
    "for i in range(30):\n",
    "    pre_day.append(pre_A[i]*1e4)\n",
    "    pre_day.append(pre_B[i]*1e4)\n",
    "test_day['amount']=pre_day\n",
    "#\n",
    "if not os.path.exists('submit/'):\n",
    "    os.makedirs('submit/')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "#\n",
    "f=open('submit/test_day_lstm.txt','w')\n",
    "f.write('Date'+','+'Post_id'+','+'Predict_amount'+'\\n')\n",
    "for _,date,post_id,amount in test_day.itertuples():\n",
    "    f.write(date+','+post_id+','+str(int(amount))+'\\n')\n",
    "f.close()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "huawei_copy",
   "language": "python",
   "name": "huawei_copy"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}